import subprocess
import sys
import os

def crop_beginning(input_file, seconds_to_crop, output_file=None):
    """
    裁剪MP4文件的前几秒
    :param input_file: 输入视频文件路径
    :param seconds_to_crop: 要裁剪的秒数（可以是小数）
    :param output_file: 输出视频文件路径（可选）
    """
    # 验证输入文件是否存在
    if not os.path.isfile(input_file):
        print(f"错误：输入文件 '{input_file}' 不存在")
        sys.exit(1)
    
    # 验证秒数有效性
    try:
        seconds = float(seconds_to_crop)
        if seconds <= 0:
            raise ValueError
    except ValueError:
        print("错误：秒数必须是大于0的数字")
        sys.exit(1)
    
    # 生成默认输出文件名
    if not output_file:
        name, ext = os.path.splitext(input_file)
        output_file = f"{name}_cropped{ext}"
    
    # 删除上一次的输出文件（如果存在）
    if os.path.exists(output_file):
        os.remove(output_file)
    
    # 构建FFmpeg命令
    command = [
        'ffmpeg',
        '-ss', str(seconds),       # 跳过指定秒数
        '-i', input_file,          # 输入文件
        '-c', 'copy',              # 直接流复制（不重新编码）
        '-avoid_negative_ts', 'make_zero',  # 防止时间戳问题
        '-y',                      # 覆盖输出文件（如果存在）
        output_file
    ]
    
    print(f"正在裁剪: 跳过 {seconds} 秒，输入: {input_file}, 输出: {output_file}")
    
    try:
        # 执行FFmpeg命令
        result = subprocess.run(command, check=True, stderr=subprocess.PIPE)
        print("裁剪成功！")
        return True
    except subprocess.CalledProcessError as e:
        error_message = e.stderr.decode()
        print(f"裁剪失败: {error_message}")
        
        # 检查常见错误：关键帧问题
        if "Non-monotonous DTS" in error_message or "DTS < DTS" in error_message:
            print("\n提示：尝试使用重新编码模式（添加 -r 参数）解决关键帧问题")
        
        return False

if __name__ == "__main__":
    # 帮助信息
    help_msg = """
视频裁剪工具 - 使用FFmpeg裁剪MP4文件开头部分

用法:
  python video_crop.py <输入文件> <秒数> [输出文件]
  
示例:
  python video_crop.py video.mp4 3.5             # 裁剪前3.5秒
  python video_crop.mp4 input.mp4 5 output.mp4   # 裁剪前5秒并指定输出文件
    """
    
    if len(sys.argv) < 3 or sys.argv[1] in ['-h', '--help']:
        print(help_msg)
        sys.exit(0)
    
    input_file = sys.argv[1]
    seconds = sys.argv[2]
    output_file = sys.argv[3] if len(sys.argv) > 3 else None
    
    crop_beginning(input_file, seconds, output_file)